//
// Created by LiuYou on 2021/5/20.
//

#include <cstdlib>
#include <unistd.h>
#include <cstdio>
#include <sys/wait.h>


int main() {
    const int LEFT = 30000000;
    const int RIGHT = 30000200;
    int mark{};
    for (int i = LEFT; i <= RIGHT; ++i) {
        // 父进程会回到这里继续fork, 而子进程会在if逻辑中正常返回。
        pid_t pid = fork();


        if (pid < 0) {
            std::perror("fork()");
            std::exit(1);
        } else if (pid == 0) {
            // 子进程
            mark = 1;
            for (int j = 2; j < i / 2; ++j) {
                if (i % j == 0) {
                    mark = 0;
                    break;
                }
            }
            if (mark == 1) {
                std::fprintf(stdout, "%d is prime number.\n", i);
            }

            // 执行完自己的任务后, 子进程正常退出。
            // 让子进程正常结束, 如果没有下面这行代码, 子进程也会去fork。
            std::exit(0);
        } else {
            // 父进程
            // 父进程在这个if-else逻辑中, 什么也不做, 然后继续去for-i循环中fork子进程。
        }

    }


    // 有了下面这部分才是完整的程序。
    int state{};
    // 释放资源
    for (int i = LEFT; i < RIGHT; ++i) {
//        wait(&state);
        // 为父进程产生的子进程进行收尸处理。
        wait(nullptr);
    }


    std::exit(0);
}